package TADs;

import javax.swing.JOptionPane;

/**
 *
 * @author Achiles
 */
// Lista Ordenada
public class Lista {

    private No primeiro;
    //Total de nós
    int totalNos;

    //Construtor da lista
    public Lista() {
        primeiro = null;
        totalNos = 0;
    }

    //Retorna o total de nós da Lista
    public int getTotalNos() {
        return totalNos;
    }

    // Verifica se está vazia
    public boolean Vazia() {
        if (getTotalNos() == 0) {
            return true;
        }
        return false;
    }

    public void inserir(int v) {

        No temp = new No(v);    // nó contendo o valor a ser inserido
        // 1o Caso: Lista Vazia
        if (Vazia()) {
            primeiro = temp;
            totalNos++;
        } else {
            No aux = primeiro;
            // 2o Caso: Inserir no Começo
            if (temp.valor < aux.valor) {
                temp.prox = primeiro;
                primeiro = temp;
                totalNos++;
            } else {
                while ((aux.prox != null) && (temp.valor > aux.prox.valor)) {
                    aux = aux.prox;
                }
                // 3o Caso: Elemento no meio
                if (aux.prox != null) {
                    System.out.println("Meio");
                   
                    temp.prox = aux.prox;
                    aux.prox = temp;
                } else {
                    // 4o Caso: Elemento no final
                    System.out.println("Fim");
                    aux.prox = temp;
                }
                totalNos++;
            }
        }



//        No temp = new No(v);
//        No auxiliar = primeiro;
//        No auxiliar2 = auxiliar.prox;
//        //Caso Geral: A lista contém elementos
//        if (primeiro != null) {
//            //Caso 2: Inserir no começo da lista
//            if (primeiro.valor > v) {
//                temp.prox = primeiro;
//                primeiro = temp;
//            } else {
//                //Percorre a lista até encontrar o lugar correto para inserir o elemento
//                while (temp.valor > auxiliar.valor && auxiliar2 != null){
//                        auxiliar = auxiliar2;
//                        auxiliar2 = auxiliar2.prox;
//                }
//                //Caso 3: Inserir no meio da lista
//                if (auxiliar2 != null) {
//                    System.out.println("Meio da lista");
//                    temp.prox = auxiliar.prox;
//                    auxiliar.prox = temp;
//                    //Caso 4: Inserir no fim da lista
//                } else {
//                    System.out.println("Fim da lista");
//                    temp.prox = null;
//                    auxiliar.prox = temp;
//                }
//            }
//            
//            //Caso 1: A lista está vazia
//        }else {
//            primeiro = temp;
//        }
//        totalNos++;
    }

    public void excluirNo(int v) {

        No temp = new No(v);
        No auxiliar = primeiro;
        //Caso Geral: A lista contém elementos
        if (primeiro != null) {
            //Caso 2: Remover no começo da lista
            if (primeiro.valor == v) {
                primeiro = primeiro.prox;
                totalNos--;
            } else {
                //Percorre a lista até encontrar o lugar correto para retirar o elemento
                while ((auxiliar.prox != null) && (auxiliar.prox.valor != v)) {
                    auxiliar = auxiliar.prox;
                }
                if (auxiliar.prox != null) {
                    //Caso 3: Remover no meio da lista
                    if (auxiliar.prox.prox != null) {
                        auxiliar.prox = auxiliar.prox.prox;
                    } //Caso 4: remover no fim da lista
                    else {
                        auxiliar.prox = null;
                    }
                    totalNos--;
                } // Não está na lista
                else {
                    JOptionPane.showMessageDialog(null, "O elemento que você tentou remover não está na lista !", "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }

            //Caso 1: A lista está vazia
        } else {
            JOptionPane.showMessageDialog(null, "A Lista está Vazia!", "Erro", JOptionPane.ERROR_MESSAGE);
        }

    }

    public void exibirLista() {
        No auxiliar = primeiro;
        // Caso contenha elementos
        if (auxiliar != null) {
            JOptionPane.showMessageDialog(null, "Os elementos que estão na lista são: ");
            while (auxiliar != null) {
                JOptionPane.showMessageDialog(null,auxiliar.valor);
                auxiliar = auxiliar.prox;
            }
        } //Lista vazia
        else {
            JOptionPane.showMessageDialog(null, "A Lista está Vazia!", "Erro", JOptionPane.ERROR_MESSAGE);
        }

    }
}
